From 70efc627d23e23df976281c49b630d5cc5f4ed84 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Thu, 14 Dec 2006 10:17:37 +0000 Subject: [PATCH] [Xend] Add a --force option to detach operations. In some situations triggered by errors found on guest side, the device will be held forever, due to the online flag being still on. Detach operations mostly fails from this point on, as the backend will not see frontend's state change anymore. Signed-off-by: Glauber de Oliveira Costa --- tools/python/xen/xend/XendDomainInfo.py | 4 ++-- tools/python/xen/xend/server/DevController.py | 9 ++++++++- tools/python/xen/xend/server/blkif.py | 6 +++--- tools/python/xen/xm/main.py | 17 ++++++++++++----- 4 files changed, 25 insertions(+), 11 deletions(-) diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index de66eb4e75..e26d2ffdab 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -563,7 +563,7 @@ class XendDomainInfo: for devclass in XendDevices.valid_devices(): self.getDeviceController(devclass).waitForDevices() - def destroyDevice(self, deviceClass, devid): + def destroyDevice(self, deviceClass, devid, force=None): try: devid = int(devid) except ValueError: @@ -578,7 +578,7 @@ class XendDomainInfo: devid = entry break - return self.getDeviceController(deviceClass).destroyDevice(devid) + return self.getDeviceController(deviceClass).destroyDevice(devid, force) diff --git a/tools/python/xen/xend/server/DevController.py b/tools/python/xen/xend/server/DevController.py index 7f738ab67e..aa96e323ce 100644 --- a/tools/python/xen/xend/server/DevController.py +++ b/tools/python/xen/xend/server/DevController.py @@ -195,7 +195,7 @@ class DevController: raise VmError('%s devices may not be reconfigured' % self.deviceClass) - def destroyDevice(self, devid): + def destroyDevice(self, devid, force): """Destroy the specified device. @param devid The device ID, or something device-specific from which @@ -216,6 +216,13 @@ class DevController: self.writeBackend(devid, 'online', "0") self.writeBackend(devid, 'state', str(xenbusState['Closing'])) + if force: + frontpath = self.frontendPath(devid) + backpath = xstransact.Read(frontpath, "backend") + if backpath: + xstransact.Remove(backpath) + xstransact.Remove(frontpath) + def configurations(self): return map(self.configuration, self.deviceIDs()) diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py index bba11ebe1f..44d1a1e1ff 100644 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -133,7 +133,7 @@ class BlkifController(DevController): return config - def destroyDevice(self, devid): + def destroyDevice(self, devid, force): """@see DevController.destroyDevice""" # If we are given a device name, then look up the device ID from it, @@ -142,13 +142,13 @@ class BlkifController(DevController): # superclass's method. try: - DevController.destroyDevice(self, int(devid)) + DevController.destroyDevice(self, int(devid), force) except ValueError: devid_end = type(devid) is str and devid.split('/')[-1] or None for i in self.deviceIDs(): d = self.readBackend(i, 'dev') if d == devid or (devid_end and d == devid_end): - DevController.destroyDevice(self, i) + DevController.destroyDevice(self, i, force) return raise VmError("Device %s not connected" % devid) diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py index 779b5280b8..981c01f1e9 100644 --- a/tools/python/xen/xm/main.py +++ b/tools/python/xen/xm/main.py @@ -142,14 +142,14 @@ SUBCOMMAND_HELP = { 'Create a new virtual block device.'), 'block-configure': (' [BackDomain]', 'Change block device configuration'), - 'block-detach' : (' ', + 'block-detach' : (' [-f|--force]', 'Destroy a domain\'s virtual block device.'), 'block-list' : (' [--long]', 'List virtual block devices for a domain.'), 'network-attach': (' [--script=